/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.arca.documento.electronico.webservice.envio;

import com.arca.documento.electronicoo.webservice.autorizacion.Autorizacion;
import com.arca.documento.electronicoo.webservice.autorizacion.AutorizacionComprobantes;
import com.arca.documento.electronicoo.webservice.autorizacion.AutorizacionComprobantesService;
import com.arca.documento.electronicoo.webservice.autorizacion.RespuestaComprobante;
import com.arca.documento.electronicoo.webservice.autorizacion.RespuestaLote;
import com.google.common.collect.Lists;
import java.io.File;
import java.net.URL;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.log4j.Logger;

/**
 *
 * @author use12
 */
public class AutorizacionDocumentoWS {

    static final Logger logger = Logger.getLogger(AutorizacionDocumentoWS.class);
    private AutorizacionComprobantesService service;
    public static final String AUTORIZADO = "AUTORIZADO";
    public static final String NO_AUTORIZADO = "NO AUTORIZADO";

    public AutorizacionDocumentoWS(String wsdlLocation) {
        try {
            URL url = new URL(wsdlLocation);
            QName qname = new QName("http://ec.gob.sri.ws.autorizacion", "AutorizacionComprobantesService");
            this.service = new AutorizacionComprobantesService(url, qname);
        } catch (Exception ex) {
            logger.error(ex, ex);
        }
    }

    public RespuestaComprobante autorizacionDocumentoIndividual(String claveDeAcceso) {
        RespuestaComprobante respuesta = null;
        try {
            AutorizacionComprobantes port = this.service.getAutorizacionComprobantesPort();
            respuesta = port.autorizacionComprobante(claveDeAcceso);
        } catch (Exception e) {
            logger.error(e, e);
            return respuesta;
        }
        return respuesta;
    }

    public RespuestaLote autorizacionDocumentoPorLote(String claveDeAcceso) {
        RespuestaLote respuesta = null;
        try {
            AutorizacionComprobantes port = this.service.getAutorizacionComprobantesPort();
            respuesta = port.autorizacionComprobanteLote(claveDeAcceso);
        } catch (Exception e) {
            logger.error(e, e);
        }
        return respuesta;
    }

    public static String autorizarDocumentoIndividual(String claveDeAcceso, String nombreArchivo, String tipoAmbiente) {
        StringBuilder sb = new StringBuilder();
        try {
            String dirAutorizados = null; //new ConfiguracionDirectorioSQL().obtenerDirectorio(DirectorioEnum.AUTORIZADOS.getCode()).getPath();
            String dirNoAutorizados = null; //new ConfiguracionDirectorioSQL().obtenerDirectorio(DirectorioEnum.NO_AUTORIZADOS.getCode()).getPath();

            RespuestaComprobante respuesta = null;

            for (int i = 0; i < 5; i++) {
                String urlWs = null; // FormGenerales.devuelveUrlWs(tipoAmbiente, "AutorizacionComprobantes")
                respuesta = new AutorizacionDocumentoWS(urlWs).autorizacionDocumentoIndividual(claveDeAcceso);

                if (!respuesta.getAutorizaciones().getAutorizacion().isEmpty()) {
                    break;
                }
                Thread.currentThread();
                Thread.sleep(300L);
            }
            int i;
            if (respuesta != null) {
                i = 0;
                for (Autorizacion item : respuesta.getAutorizaciones().getAutorizacion()) {
                    sb.append(item.getEstado());
                    /* ***
                     item.setComprobante("<![CDATA[" + item.getComprobante() + "]]>");

                     XStream xstream = XStreamUtil.getRespuestaXStream();
                     Writer writer = null;
                     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                     writer = new OutputStreamWriter(outputStream, "UTF-8");
                     writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

                     xstream.toXML(item, writer);
                     String xmlAutorizacion = outputStream.toString("UTF-8");

                     if ((i == 0) && (item.getEstado().equals("AUTORIZADO"))) {
                     ArchivoUtils.stringToArchivo(dirAutorizados + File.separator + nombreArchivo, xmlAutorizacion);
                     VisualizacionRideUtil.decodeArchivoBase64(dirAutorizados + File.separator + nombreArchivo, item.getNumeroAutorizacion(), item.getFechaAutorizacion().toString());
                     break;
                     }
                     if (item.getEstado().equals("NO AUTORIZADO")) {
                     ArchivoUtils.stringToArchivo(dirNoAutorizados + File.separator + nombreArchivo, xmlAutorizacion);
                     sb.append("|" + obtieneMensajesAutorizacion(item));

                     verificarOCSP(item);

                     break;
                     }
                     i++;
                     *** */
                }
            }

            if ((respuesta == null) || (respuesta.getAutorizaciones().getAutorizacion().isEmpty() == true)) {
                sb.append("TRANSMITIDO SIN RESPUESTA|Ha ocurrido un error en el proceso de la Autorización, por lo que se traslado el archivo a la carpeta de: transmitidosSinRespuesta");

                String dirFirmados = null; //new ConfiguracionDirectorioSQL().obtenerDirectorio(DirectorioEnum.FIRMADOS.getCode()).getPath();
                String dirTransmitidos = dirFirmados + File.separator + "transmitidosSinRespuesta";

                File transmitidos = new File(dirTransmitidos);
                if (!transmitidos.exists()) {
                    new File(dirTransmitidos).mkdir();
                }

                File archivoFirmado = new File(new File(dirFirmados), nombreArchivo);
                /* ***
                 if (!ArchivoUtils.copiarArchivo(archivoFirmado, transmitidos.getPath() + File.separator + nombreArchivo)) {
                 sb.append("\nError al mover archivo a carpeta de Transmitidos sin Respuesta");
                 } else {
                 archivoFirmado.delete();
                 }
                 *** */
            }
        } catch (Exception ex) {
            logger.error(ex, ex);
        }
        return sb.toString();
    }

    public static List<Autorizacion> autorizarComprobanteLote(String claveDeAcceso, String nombreArchivoLote, int timeout, 
            int cantidadArchivos, String tipoAmbiente) {
        List autorizaciones = Lists.newArrayList();
        RespuestaLote respuestaAutorizacion = null;
        try {
            String dirAutorizados = null; //new ConfiguracionDirectorioSQL().obtenerDirectorio(DirectorioEnum.AUTORIZADOS.getCode()).getPath();
            String dirRechazados = null; //new ConfiguracionDirectorioSQL().obtenerDirectorio(DirectorioEnum.NO_AUTORIZADOS.getCode()).getPath();
            String dirFirmados = null; //new ConfiguracionDirectorioSQL().obtenerDirectorio(DirectorioEnum.FIRMADOS.getCode()).getPath();

            Thread.currentThread();
            Thread.sleep(timeout * cantidadArchivos * 1000);

            for (int i = 0; i < 5; i++) {
                String urlWs = null;//FormGenerales.devuelveUrlWs(tipoAmbiente, "AutorizacionComprobantes")
                //respuestaAutorizacion = new AutorizacionDocumentoWS(urlWs).llamadaWsAutorizacionLote(claveDeAcceso);
                respuestaAutorizacion = new AutorizacionDocumentoWS(urlWs).autorizacionDocumentoPorLote(claveDeAcceso);

                if (!respuestaAutorizacion.getAutorizaciones().getAutorizacion().isEmpty()) {
                    break;
                }
                Thread.currentThread();
                Thread.sleep(500L);
            }

            String comprobantesProcesados = respuestaAutorizacion.getNumeroComprobantesLote();
            for (Autorizacion item : respuestaAutorizacion.getAutorizaciones().getAutorizacion()) {
                item.setComprobante("<![CDATA[" + item.getComprobante() + "]]>");
                //String claveAcceso = ArchivoUtils.obtieneClaveAccesoAutorizacion(item);
                String claveAcceso = null;
                /* ***
                XStream xstream = XStreamUtil.getRespuestaLoteXStream();
                Writer writer = null;
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                writer = new OutputStreamWriter(outputStream, "UTF-8");
                writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

                xstream.toXML(item, writer);

                String nombreArchivoConRespuesta = claveAcceso + ".xml";
                String xmlAutorizacion = outputStream.toString("UTF-8");

                if (item.getEstado().equals("AUTORIZADO")) {
                    ArchivoUtils.stringToArchivo(dirAutorizados + File.separator + nombreArchivoConRespuesta, xmlAutorizacion);
                } else {
                    ArchivoUtils.stringToArchivo(dirRechazados + File.separator + nombreArchivoConRespuesta, xmlAutorizacion);
                }

                File archivoABorrar = new File(dirFirmados + File.separator + nombreArchivoConRespuesta);
                if (archivoABorrar.exists() == true) {
                    archivoABorrar.delete();
                }

                item.setEstado(nombreArchivoConRespuesta + "|" + item.getEstado() + "|" + comprobantesProcesados);
                autorizaciones.add(item);
                *** */
            }
        } catch (Exception ex) {
            logger.error(ex, ex);
        }
        return autorizaciones;
    }
}
